/**
 * 日期格式化工具函数
 */

/**
 * 格式化日期为本地化字符串
 * @param {string|Date} date - 日期字符串或Date对象
 * @param {Object} options - 格式化选项
 * @returns {string} 格式化后的日期字符串
 */
export const formatDate = (date, options = {}) => {
    if (!date) return '未知时间'

    try {
        const dateObj = new Date(date)

        // 检查日期是否有效
        if (isNaN(dateObj.getTime())) {
            return '无效日期'
        }

        const defaultOptions = {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit',
            ...options
        }

        return dateObj.toLocaleString('zh-CN', defaultOptions)
    } catch (error) {
        console.error('日期格式化错误:', error)
        return '日期格式错误'
    }
}

/**
 * 格式化日期为简短格式（只显示日期）
 * @param {string|Date} date - 日期字符串或Date对象
 * @returns {string} 格式化后的日期字符串
 */
export const formatDateShort = (date) => {
    return formatDate(date, {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    })
}

/**
 * 格式化相对时间（如：2小时前、3天前）
 * @param {string|Date} date - 日期字符串或Date对象
 * @returns {string} 相对时间字符串
 */
export const formatRelativeTime = (date) => {
    if (!date) return '未知时间'

    try {
        const dateObj = new Date(date)
        const now = new Date()
        const diffMs = now.getTime() - dateObj.getTime()

        // 检查日期是否有效
        if (isNaN(dateObj.getTime())) {
            return '无效日期'
        }

        // 如果是未来时间，直接返回格式化日期
        if (diffMs < 0) {
            return formatDate(date)
        }

        const diffSeconds = Math.floor(diffMs / 1000)
        const diffMinutes = Math.floor(diffSeconds / 60)
        const diffHours = Math.floor(diffMinutes / 60)
        const diffDays = Math.floor(diffHours / 24)
        const diffMonths = Math.floor(diffDays / 30)
        const diffYears = Math.floor(diffDays / 365)

        if (diffSeconds < 60) {
            return '刚刚'
        } else if (diffMinutes < 60) {
            return `${diffMinutes}分钟前`
        } else if (diffHours < 24) {
            return `${diffHours}小时前`
        } else if (diffDays < 30) {
            return `${diffDays}天前`
        } else if (diffMonths < 12) {
            return `${diffMonths}个月前`
        } else {
            return `${diffYears}年前`
        }
    } catch (error) {
        console.error('相对时间格式化错误:', error)
        return '时间格式错误'
    }
}

/**
 * 检查日期是否有效
 * @param {string|Date} date - 日期字符串或Date对象
 * @returns {boolean} 是否为有效日期
 */
export const isValidDate = (date) => {
    if (!date) return false

    try {
        const dateObj = new Date(date)
        return !isNaN(dateObj.getTime())
    } catch (error) {
        return false
    }
}

/**
 * 获取友好的日期显示格式
 * @param {string|Date} date - 日期字符串或Date对象
 * @param {boolean} showRelative - 是否显示相对时间
 * @returns {string} 友好的日期字符串
 */
export const getFriendlyDate = (date, showRelative = false) => {
    if (!isValidDate(date)) {
        return '未知时间'
    }

    if (showRelative) {
        const now = new Date()
        const dateObj = new Date(date)
        const diffDays = Math.floor((now.getTime() - dateObj.getTime()) / (1000 * 60 * 60 * 24))

        // 如果是7天内，显示相对时间
        if (diffDays >= 0 && diffDays <= 7) {
            return formatRelativeTime(date)
        }
    }

    return formatDate(date)
}